package com.mysiteforme.admin.util;

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class WX_TokenUtil {


    private static Logger logger = LoggerFactory.getLogger(WX_TokenUtil.class);
    /**
     * 获得微信 AccessToken
     * access_token是公众号的全局唯一接口调用凭据，公众号调用各接口时都需使用access_token。
     * 开发者需要access_token的有效期目前为2个小时，需定时刷新，重复获取将导致上次获取
     * 的access_token失效。
     * （此处我是把token存在java缓存里面了）此代码token没有加入缓存,后面附了缓存的工具类,根据需求自己添加
     */
    @Autowired
    private RedisService redisUtil;

    public AccessToken getWXToken(String touser) {
        //2小时之内相同用户下单而导致获取token发送消息导致凭证失效问题
        //token存放到redis的有效期为2小时，全局用一个则可以，失效重新获取
        AccessToken access_token = new AccessToken();
        try {
            if (redisUtil.exists("AccessToken:public")) {
                String accessToken = (String) redisUtil.get("AccessToken:public");
                access_token.setAccessToken(accessToken);
            } else {
                String appId = Constants.APPID;
                String appSecret = Constants.PSECRET;
                String tokenUrl = Constants.ACCESS_TOKEN + "&appid=" + appId + "&secret=" + appSecret;
                //获取access_token
                JSONObject jsonObject = WX_HttpsUtil.httpsRequest(tokenUrl, "GET", null);
                if (jsonObject != null) {
                    logger.info("------->发送请求获取微信JSON：" + jsonObject.toJSONString() + "<-------");
                    if (jsonObject.get("errcode") == null) {
                        String accessToken = jsonObject.getString("access_token");
                        int expiresin = jsonObject.getInteger("expires_in");
                        access_token.setAccessToken(accessToken);
                        access_token.setExpiresin(expiresin);
                        redisUtil.set("AccessToken:public", accessToken, Long.valueOf(expiresin));
                    }
                }else {
                    access_token = null;
                }
            }
        } catch (Exception e) {
            access_token = null;
            e.printStackTrace();
        }

        return access_token;
    }

}
